package thefirst.controller;

import java.sql.SQLException;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;



import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import thefirst.member.model.MemberService;
import thefirst.member.model.MemberVO;
import thefirst.member.model.StudentVO;
import thefirst.member.model.TeacherVO;
@Controller
public class MemberController extends MultiActionController {
	@Resource(name="memberServiceImpl")
	private MemberService memberService;
	
	// registerStudentStart.do : header.jsp의 경로에서 넘어옴 
		// tiles 에서 학생 회원가입 view를 보여주는 페이지
		@RequestMapping("/registerStudentStart.do")
		private String registerStudentStart() throws SQLException {
			System.out.println("registerStudentStart"); 
			return "student.member";
		}
		// casting : teacher와 student에서 student로 분류, student_Register.jsp에서 넘어오는 페이지
		@RequestMapping("/castingStudent.do")
		private String castingStudent(StudentVO svo) throws SQLException {
			System.out.println("castingStudent"+svo);
			// registerMember를 호출
			registerMember(svo);
			System.out.println("castingStudent");
			// studentRegister_result.jsp 경로
			return "student.result";
		}
		// registerTeacherStart.do : header.jsp의 경로에서 넘어옴 
		// tiles 에서 선생님 회원가입 view를 보여주는 페이지
		@RequestMapping("/registerTeacherStart.do")
		private String registerTeacherStart() throws SQLException {
			System.out.println("registerTeacherStart");
			return "teacher.member";
		}
		// casting : teacher와 student에서 teacher로 분류, teacher_Register.jsp에서 넘어오는 페이지
		@RequestMapping("/castingTeacher.do")
		private String castingTeacher(TeacherVO tvo) throws SQLException {
			System.out.println("castingTeacher");
			// registerMember를 호출
			registerMember(tvo);
			System.out.println("castingTeacher");
			// teacherRegister_result.jsp 경로
			return "teacher.result";
		}
		// MemberService
		public void registerMember(MemberVO mvo) throws SQLException{	
			System.out.println(mvo+"1");
			memberService.registerMember(mvo);
			System.out.println(mvo+"2");
	}
	public String login(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("member login");
		return "login.member";
	}
	public String find(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("member find");
		return "find.member";
	}
	public String adminLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("admin login");
		// tiles-def-member.xml : definition name="*/*.member
		// value="/member/{1}/{2}_form.jsp"
		return "admin/adminLogin.member";
	}
	public String adminUpdate(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("admin update");
		return "admin/adminUpdate.member";
	}
	
	/**
	 * profile
	 * 개인 정보를 가져오는 메서드 ..
	 * 마이페이지 서비스에서 사용을 한다.
	 * return profile.profile.mypage
	 * -> mypage\profile\profile_main.jsp
	 * @param request
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */
	
	@RequestMapping("/profile.do")
	public String profile(HttpServletRequest request,MemberVO mvo) throws SQLException{
		
		MemberVO  rmvo=memberService.showMember(mvo);
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController profile"+rmvo);
		//조회결과를 requestScope에 저장!
		request.setAttribute("mvo", rmvo);
		return "profile/profile.mypage";
	}

	/**
	 * updateMember
	 * 개인 정보를 수정하는 메서드 
	 * ver-1. 이름만 수정하는 메서드
	 * ver-2. 성별 수정기능 추가
	 */
	@RequestMapping("/updateMember.do")
	@ResponseBody
	public MemberVO updateMember(HttpServletRequest request,MemberVO mvo) throws SQLException{
		System.out.println("updateMember"+mvo);
		MemberVO  rmvo=memberService.updateMember(mvo);
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController profile"+rmvo);
		//조회결과를 requestScope에 저장!
		//request.setAttribute("mvo", rmvo);
		return rmvo;
	}

	/**
	 * 로그인 메서드 입니다.
	 * login_result에서 session을 체크해서
	 * session이 있을 경우 넘어 온다.
	 * @param mvo
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping("/login.do")
	public ModelAndView login(MemberVO mvo, HttpServletRequest request,
			HttpSession session) {
		try {
			//회원의 정보를 lmvo에 담아 lmvo가 null이 아니면 session에 담는다.
			MemberVO lmvo = memberService.login(mvo);
			if (lmvo != null) {
				session.setAttribute("mvo", lmvo);
			}else if(lmvo==null){
			//lmvo가 null이면 로그인 페이지로 넘어 간다.
				return new ModelAndView("member/loginResult.loginResult");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new ModelAndView("home", "mvo", mvo);
	}
	/**
	 * 로그아웃 메서드
	 * session이 null이 아니면 session를 종료시킨다.
	 * @param session
	 * @return
	 */
	@RequestMapping("/logout.do")
	public ModelAndView logout(HttpSession session) {
		if (session != null) {
			session.invalidate();
		}
		return new ModelAndView("home");
	}
	/**
	 * 로그인 체크 메서드
	 * 로그인을 했을때 login_result.jsp 에서 
	 * session이 있으면 login.do
	 * session이 없으면 로그인 페이지로 간다.
	 * @param mvo
	 * @param session
	 * @return
	 */
	@RequestMapping("/loginResult.do")
	public ModelAndView loginResult(MemberVO mvo,HttpSession session){
		MemberVO lmvo;
		try {
			lmvo = memberService.login(mvo);
			if (lmvo != null) {
				session.setAttribute("mvo", lmvo);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new ModelAndView("member/loginResult.loginResult","mvo",mvo);
	}

}
